package com.dc.commons.servlet;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.context.request.NativeWebRequest;

import com.google.common.collect.Maps;

/**
 * *****************************************************************************
 * 文件名: Servlets.java <br>
 * 版本: 1.0<br>
 * 描述: Servlet 相关辅助类<br>
 * 版权所有: <br>
 * <P>
 * 创建者: 王建栋 <br>
 * 创建日期: 2015年12月16日 上午11:53:25<br>
 * 修改者: <br>
 * 修改日期: <br>
 * 修改说明: <br>
 *****************************************************************************
 */
public class Servlets {

	/**
	 * 判断该请求是否为 Ajax请求
	 * @param request
	 * @return boolean
	 */
	public static boolean isAjax(ServletRequest request){
		if(request instanceof HttpServletRequest){
			HttpServletRequest httpServletRequest=(HttpServletRequest)request;
			return "XMLHttpRequest".equalsIgnoreCase(httpServletRequest.getHeader("X-Requested-With"));
		}
		return false;
	}
	
	/**
	 * 根据前缀收集数据 查询数据，
	 * @param request
	 * @param prefix
	 * @param map
	 * @return Map<String,Object>
	 */
	public static Map<String,Object> getParametersStartingWith(NativeWebRequest request, String prefix,Map<String, Object> map){
		Map<String,String[]> requestMap=request.getParameterMap();
		
		/**
		 *  * 当包含 
		 *  	"search_OR":function(){return {EQ_dataStatus:"VALID",EQ_userName:"admin"}}(),
				"search_OR":{EQ_dataStatus:"VALID",EQ_userName:"admin"},
		 * 类型的时候 传递的参数在request 为search_OR[EQ_dataStatus] 类型
		 * 需要在这里进行转换 如下map
		 *  	OR作为key value为一个Map 其中 EQ_dataStatus 为key VALID为键
		 *  OR:{
		 *  	EQ_dataStatus:VALID,
		 *  	EQ_user_name: admin
		 */
		Pattern p=Pattern.compile("(\\S+)\\[(\\S+)\\]");
		for(Entry<String, String[]> entry:requestMap.entrySet()){
			String key =entry.getKey();
			if(key.startsWith(prefix)){
				String unprefixed = key.substring(prefix.length());
				unprefixed=unprefixed.replaceAll("\\[\\]", "");
				String[] values = request.getParameterValues(key);
				if(values.length==1){
					map.put(unprefixed, values[0].trim());
				}else{
					for(int i=0;i<values.length;i++){
						values[i]=values[i].trim();
					}
					map.put(unprefixed, values);
				}
			}
		}
		
		
		/**
		 * 当包含 com.crm.act.user.ActUser.user_EXISTS:{"actId_EQ":"111","dataStatus_EQ":"VALID"}
		 * 类型的时候 传递的参数在request 为com.crm.act.user.ActUser.user_EXISTS[actId_EQ] 类型
		 * 需要在这里进行转换 为 com.crm.act.user.ActUser.user_EXISTS :map[actId]
		 * */
		for(Entry<String,Object> entry:Maps.newHashMap(map).entrySet()){
			String key=entry.getKey().toString();
			Matcher m=p.matcher(key);
			if(m.matches()){
				String key1=m.group(1);
				String key2=m.group(2);
				
				Object value=map.get(key);
				if(value!=null&&StringUtils.isNotEmpty(value.toString())){
					if(!map.containsKey(key1)){
						map.put(key1, new HashMap<String,Object>());
					}
					@SuppressWarnings("unchecked")
					Map<String,Object> hashMap=(Map<String,Object>)map.get(key1);
					hashMap.put(key2, map.get(key));
					map.remove(entry.getKey());
				}
			}
		}
		
		return map;
	}
}
